/*
  1. type 可以定义任意类型, 而 interface 只能定义对象类型
  2. type 定义对象类型更加灵活, 而 interface 不能使用这个
    [key in Keys]: any
  3. type 定义类型不能重名，而 interface 会声明合并
  4. type 继承需要使用 & （交叉类型），而 interface 使用 extends
  5. 总结：
    定义对象类型一般用interface
    定义数组类型一般用type
*/  
// type 可以定义任意类型
type Str = string;
type Bool = boolean;
type Person = {
  name: string;
};

// interface 只能定义对象类型

// type 定义对象类型更加灵活
type Keys = "name" | "age";

type Person1 = {
  [key in Keys]: any;
};

// 相当于
type Person11 = {
  name: any;
  age: any;
};

interface Person2 {
  // [key in Keys]: any; // interface不支持这种写法
  name: any; // 只能手动写
  age: any;
  hobby: string;
}

// type 定义类型不能重名
// type Person11 = {
//   name: any;
//   age: any;
// };

// 声明合并
interface Person2 {
  name: any; // 只能手动写
  age: any;
  sex: string;
}

interface A {
  name: string;
}
interface B {
  age: number;
}
// interface 通过extends（继承）来达到类型复用
interface C extends A, B {}

type D = {
  name: string;
};
type E = {
  age: number;
};
// type 通过 & （交叉类型）来达到类型复用
type F = D & E;
